package uniriotec.dsw.tickets.dao.implHibernate;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Order;



import uniriotec.dsw.tickets.dao.interfaces.IUsuarioDAO;
import uniriotec.dsw.tickets.dao.util.HibernateUtil;
import uniriotec.dsw.tickets.modelo.Usuario;
import uniriotec.dsw.tickets.modelo.UsuarioFinal;

public class UsuarioDAOHibernate implements IUsuarioDAO {
    private Session session;
    private Transaction transaction;
    
    public void setSession(Session session){
     	
    	this.session = session;
    
    }
	
    public void create(Usuario usuario) {
    try{	
    	this.session = HibernateUtil.getSessionFactory().getCurrentSession();
    	this.transaction = this.session.beginTransaction();
		//this.session.saveOrUpdate(usuario.getPerfil());
    	this.session.save(usuario);
		this.transaction.commit();
    }catch(HibernateException e)
    {
     System.out.println("Não foi possível inserir o Usuário. Erro: "+e.getMessage());	
    }finally
    {
    	try{
    		if (this.session.isOpen()){
    			this.session.close();
    		}
    	}catch(Throwable e){
    		System.out.println("Erro ao fechar operação de inserção: "+e.getMessage());
    	}
    }
	}

	public void update(Usuario Usuario) {

	    try{	
	    	this.session = HibernateUtil.getSessionFactory().getCurrentSession();
	    	this.transaction = this.session.beginTransaction();
			this.session.update(Usuario);
			this.transaction.commit();
	    }catch(HibernateException e)
	    {
	     System.out.println("Não foi possível alterar o Usuario. Erro: "+e.getMessage());	
	    }finally
	    {
	    	try{
	    		if (this.session.isOpen()){
	    			this.session.close();
	    		}
	    	}catch(Throwable e){
	    		System.out.println("Erro ao fechar operação de inserção: "+e.getMessage());
	    	}
	    }

		
	}

	public void remove(Usuario Usuario) {

	    try{	
	    	this.session = HibernateUtil.getSessionFactory().getCurrentSession();
	    	this.transaction = this.session.beginTransaction();
			this.session.delete(Usuario);
			this.transaction.commit();
	    }catch(HibernateException e)
	    {
	     System.out.println("Não foi possível excluir o País. Erro: "+e.getMessage());	
	    }finally
	    {
	    	try{
	    		if (this.session.isOpen()){
	    			this.session.close();
	    		}
	    	}catch(Throwable e){
	    		System.out.println("Erro ao fechar operação de exclusão: "+e.getMessage());
	    	}
	    }

		
	}
	
	public Usuario find(Long id) {
        Usuario Usuario = null;
	    try{	
	    	this.session = HibernateUtil.getSessionFactory().getCurrentSession();
	    	this.transaction = this.session.beginTransaction();
	    	Usuario = (Usuario)this.session.get(Usuario.class, id);
	    	this.transaction.commit();
	    }catch(HibernateException e)
	    {
		    if (this.transaction.isActive()){
		    	this.transaction.rollback();
		    }
		    }finally
	    {
	    	try{
	    		if (this.session.isOpen()){
	    			this.session.close();
	    		}
	    	}catch(Throwable e){
	    		System.out.println("Erro ao fechar operação de busca: "+e.getMessage());
	    	}
	    }

		return Usuario; 
	}

	@SuppressWarnings("unchecked")
	public List<Usuario> list() {
		List<Usuario> usuarios =null ;
		Criteria lista;
	    try{
	    			    	
			/*this.session = HibernateUtil.getSessionFactory().getCurrentSession();
			this.transaction = this.session.beginTransaction();
		    usuarios =(List<Usuario>) session.createQuery("from Usuario").list();
		    this.transaction.commit();*/
	    	this.session = HibernateUtil.getSessionFactory().getCurrentSession();
	    	this.transaction = this.session.beginTransaction();
	    	lista = this.session.createCriteria(Usuario.class);
	    	lista.addOrder(Order.asc("nome"));
	    	usuarios = (List<Usuario>)lista.list();
	    	this.transaction.commit();
	    }catch(HibernateException e)
	    {
	    if (this.transaction.isActive()){
	    	System.out.println("Erro ao fechar operação de listagem: "+e.getMessage());
	    	
	    	this.transaction.rollback();
	    }	
	    }finally
	    {
	    	try{
	    		if (this.session.isOpen()){
	    			this.session.close();
	    		}
	    	}catch(Throwable e){
	    		System.out.println("Erro ao fechar operação de listagem: "+e.getMessage());
	    	}
	    }

		return usuarios;	
		
	}

	public Usuario findByEmail(String email) {
		String hql = "select u from Usuario u where u.email = :email";
		Query consulta = this.session.createQuery(hql);
		consulta.setString("email", email);

		//TODO mostrar primeiramente com o list e depois apresentar o uniqueResult
		return (Usuario) consulta.uniqueResult();
	}

	

}
